package main

import (
	"fmt"
)

func main13() {
	ages01 := map[string]int{
		"alice": 31,
		"bob":   13,
	}

	ages02 := make(map[string]int)
	ages02["chris"] = 20
	ages02["paul"] = 30
	//age01和age02两种初始化的方式等价

	m1 := make(map[string]int)
	m2 := map[string]int{}

	//m1和m2创建方式等价，都是创建了一个空的的map，这个时候m1和m2没有任何元素

	for name, age := range ages01 {
		fmt.Printf("%s\t%d\n", name, age)
	}
	for name, age := range ages02 {
		fmt.Printf("%s\t%d\n", name, age)
	}
	var nullMap map[string]int          //声明但未初始化map，此时是map的零值状态（只有一个nil元素）
	emptyMap := map[string]int{}        //创建了初始化了一个空的的map，这个时候empty_map没有任何元素
	fmt.Println(m1 != nil && m2 != nil) //true
	fmt.Println(len(nullMap) == 0)
	fmt.Println(nullMap == nil) //true,此时是map的零值状态(nil)
	fmt.Println(len(emptyMap) == 0)
	fmt.Println(emptyMap == nil) //false,空的的map不等价于nil(map的零值状态)
	emptyMap["test"] = 12        //执行正常，空的的map可以赋值设置元素
	//	nullMap["test"] = 12        //panic: assignment to entry in nil map，无法给未初始化的map赋值设置元素

	personSalary := map[string]int{
		"steve": 12000,
		"jamie": 15000,
	}
	personSalary["mike"] = 9000
	fmt.Println("All items of a map")
	for key, value := range personSalary {
		fmt.Printf("personSalary[%s] = %d\n", key, value)
	}

	personSalary2 := make(map[string]int)
	personSalary2["steve"] = 12000 //增加元素
	personSalary2["jamie"] = 15000 //增加元素
	personSalary2["mike"] = 9000   //增加元素
	fmt.Println("map before change", personSalary2)
	personSalary2["mike"] = 10000 //修改元素
	fmt.Println("map after change", personSalary2)
	delete(personSalary, "mike") //删除元素
	fmt.Println("map after deletion", personSalary)

	age, ok := personSalary2["jamie"] //age才是根据键值索引到的值
	if !ok {
		fmt.Printf("索引失败，bo不是map的键值，此时age=%d", age) //索引失败会返回value的零值，这里是int类型，所以是0
	} else {
		fmt.Printf("索引成功，age=%d", age)
	}
}
